package com.mysteel.product;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 1、整合mybatis-plus
 *      1）导入依赖
 *      2）配置，参照官方文档
 *          1、配置数据源
 *              1）mysql驱动
 *              2）在application.yml配置数据源相关信息
 *      2）配置mybatis-plus
 *          1、使用@MapperScan
 *          2、配置映射文件位置
 */

/**
 * 整合spring cache对缓存进行操作
 * 1、引入spring-boot-starter-cache和spring-boot-starter-data-redis依赖
 * 2、指定缓存类型：spring.cache.type=redis
 * 3、开启缓存注解：@EnableCaching
 * 缓存常用注解：
 * @Cacheable: Triggers cache population.：将数据保存至缓存中
 * @CacheEvict: Triggers cache eviction.：移除缓存
 * @CachePut: Updates the cache without interfering with the method execution.：不影响方法执行的方式更新缓存
 * @Caching: Regroups multiple cache operations to be applied on a method.：让多个缓存操作应用在同一个方法上
 * @CacheConfig: Shares some common cache-related settings at class-level.：类级别共享一些缓存相关配置
 *
 * spring-cache的不足：
 * 1、读模式：
 *      缓存穿透：查询一个不存在的数据，解决：缓存空数据，spring.cache.redis.cache-null-values=true
 *      缓存击穿：大量并发进来同时查询一个失效的数据，解决：加锁,sync = true
 *      缓存雪崩：大量的key同时失效，解决：设置过期时间（由于设置缓存的时间不同，故过期时间也会不同）
 * 2、写模式：缓存与数据库一致性问题
 *      1）读写加锁（适用于读多写少的场景）
 *      2）引入canal，同步MySQL数据库至缓存
 *      3）读多写多直接查询数据库
 * 总结：
 * 常规数据（读多写少，及时性和一致性要求不高）完全可以使用spring-cache缓存数据
 * 特殊数据：特殊设计
 * 原理：
 * CacheManager(RedisCacheManager) -> Cache(RedisCache) -> Cache负责对缓存的读写
 *
 */
@EnableRedisHttpSession
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.mysteel.product.feign")
public class ProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class, args);
    }

}
